package pe.edu.upc.dew.pharma.dao.mysql;

import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
import org.springframework.stereotype.Repository;

import pe.edu.upc.dew.pharma.dao.UsuarioDao;
import pe.edu.upc.dew.pharma.dao.mapper.UsuarioMapper;
import pe.edu.upc.dew.pharma.model.Usuario;

@Repository
public class MysqlUsuarioDao extends SimpleJdbcDaoSupport implements UsuarioDao
{

	private static final Log logger = LogFactory.getLog(MysqlUsuarioDao.class);
	
	@Autowired
	public MysqlUsuarioDao(DataSource dataSource){
		setDataSource(dataSource);
	}
	
	@SuppressWarnings("unchecked")
	public Usuario login(Usuario usuario) {
		
		if(logger.isInfoEnabled()){
			logger.info("Login : " + usuario.toString());
		}
		
		String keyResultado = "usuarios";
		
		//Definicion del SP
		SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(getJdbcTemplate());
		simpleJdbcCall.withProcedureName("sp_login");
		simpleJdbcCall.returningResultSet(keyResultado, new UsuarioMapper());
		
		//Parametros del SP
		SqlParameterSource sqlParameterSource = new MapSqlParameterSource()
			.addValue("p_varUser", usuario.getUsuario())
			.addValue("p_varPass", usuario.getClave());
		
		//Ejecucion del SP
		Map<String, Object> resultado = simpleJdbcCall.execute(sqlParameterSource);
		
		List<Usuario> usuarios = (List<Usuario>) resultado.get(keyResultado);
		if(logger.isInfoEnabled()){
			logger.info("resultado : " + ToStringBuilder.reflectionToString(usuarios));
		}
		if(usuarios.size() > 0){
			usuario = usuarios.get(0);
		}
		return usuario;
	}
	
}
